//
//  MainViewController.swift
//  WBTest
//
//  Created by 张海峰 on 2017/7/20.
//  Copyright © 2017年 张海峰. All rights reserved.
//

import UIKit

class MainViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //设置局部tabBar 颜色
          tabBar.tintColor =  UIColor.red
        //1. 获取json 文件路径
        guard let jsonPath = Bundle.main.path(forResource: "tabbar.json", ofType: nil) else {
            print("没有获取到对应的文件路径")
            return
        }
        //2. 读取json文件的内容
        guard let jsonData = NSData.init(contentsOfFile: jsonPath) else {
            print("没有获取到json文件的内容")
            return
        }
        //3.将Data转数组
        //如果在调用系统的某个方法时，该方法最后有一个throws，说明该方法会抛出异常，如果一个方法会抛出异常，那么需要对该异常进行处理
        /*在swift 中提供三种处理异常的方式
         方式一：try方式（最不常用的方法） 程序员手动处理
         do{
         try JSONSerialization.jsonObject(with: jsonData as Data, options: .mutableContainers)
         }
         catch
         {
         print(error)
         }
         方式二 try？方式 （最常用的方法）  系统帮助我们处理异常，如果该方法出现异常返回nil 如果没有返回对应的对象
         guard let AnyObject = try? JSONSerialization.jsonObject(with: jsonData as Data, options: .mutableContainers) else
         {
         return
         }
         方式三 try！方式 （不建议，方法比较危险）  直接告诉系统没有异常，注意：如果该方法出现异常，会导致系统崩溃（类似强制解包）
         guard let AnyObject = try！ JSONSerialization.jsonObject(with: jsonData as Data, options: .mutableContainers)
         */
        guard let AnyObject = try? JSONSerialization.jsonObject(with: jsonData as Data, options: .mutableContainers) else
        {
            return
        }
        guard let dicArray = AnyObject as? [[String : AnyObject]] else {
            return
        }
        //4.遍历字典获取对应的信息
        for dict in dicArray {
            //4.1获取对应的控制器
            guard let vcName: String = dict["vcName"] as? String else{
                continue
            }
            //4.2获取对应的title
            guard let title: String = dict["title"] as? String else{
                continue
            }
            //4.3获取对应的imagename
            guard let imageName: String = dict["imageName"] as? String else{
                continue
            }
            //4.4 添加
            addChildViewController(childVCName: vcName, title: title, imagename: imageName)
        }
    }
    
    //swift 支持方法重载，方法名称相同，但是1.参数类型不同2.参数个数不同
    //private 方法私有化，当前文件中可以访问，其它文件不能访问
    private func addChildViewController(childVCName: String,title : String, imagename : String) {
        //0.获取命名空间
        guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else{
            print("没有获取对应的命名空间")
            return
        }
        //1.根据对应的字符串获取对应的Class
        guard let ChildVcClass = NSClassFromString(nameSpace + "." + childVCName) else{
            print("没有获取对应的Class")
            return
        }
        //2.将对应的AnyObject转成控制器类型
        guard let childVcType = ChildVcClass as? UIViewController.Type else
        {
            print("没有获取对应的控制器类型")
            return
        }
        let childVC = childVcType.init()
        childVC.title = title
        //3.设置子控制器属性
        childVC.tabBarItem.image = UIImage(named: imagename)
        childVC.tabBarItem.selectedImage = UIImage(named: imagename + "1")
        //4.包装导航栏控制器
        let childNav = UINavigationController(rootViewController: childVC)
        //5.添加控制器
        addChildViewController(childNav)
    }

    }
    
